// 函数可以分为：无参数   无返回值，有参数   有返回值...

function fn() { }

// 定义一个无参数无返回值的函数
// : void 是该函数的返回值类型
// void 没有返回值的意思
function fn1(): void {

}


// 带有 string 返回值的函数
function fn2(): string {
    return '你好春天'
}

// 定义有参数无返回值
function fn3(name: string, age: number): void { }

// 有参数有返回值
function fn4(name: string, age: number): string {
    return name + age
}


// 返回值是对象类型
function fn5(): {
    name: string,
    age: number
} {
    return {
        name: 'aaaa',
        age: 18
    }
}

interface iUser {
    name: string
    age: number
}
function fn6(): iUser {
    return {
        name: 'aaaa',
        age: 18
    }
}
// 返回值是一个数组
function fn7(): Array<number> {
    return [1, 2, 3, 4, 5]
}

/*
    多参数的函数
    a: any                  a 参数为任意类型
    b: number               b 为数字类型
    c: string = '你好世界'   c 为带有默认值的参数
    d?: string              d 参数为可选参数
*/
function fn8(a: any, b: number, c: string = '你好世界', d?: string) { }

// -----------------------
// fn9 是一个箭头函数的类型，参数和返回值是空
const fn9: () => void = (): void => { }

// 带有返回值的箭头函数,从后往前倒推
const fn10: () => number = (): number => {
    return 1
}

// 带有参数和返回值的箭头函数
const fn11: (count: number) => number = (count: number): number => {
    return 1
}


interface iUser {
    name: string
    age: number
}
const fn12: (user: iUser) => iUser = (user: iUser): iUser => {
    return user
}
const a = fn12({
    name: '',
    age: 1
})

// 函数定义
function getUser(user: iUser): iUser {
    return {
        name: '',
        age: 1
    }
}